已編寫指令碼的規則
在這個部分中:
關於已編寫指令碼的規則
脚本规则允许使用 Windows PowerShell 或 VB 脚本创建自定义规则。 脚本的成功或失败决定了作为规则一部分的“安全级别”、“允许的项目”和“拒绝的项目”是否适用于用户。
已編寫指令碼規則會利用可透過 PowerShell 或 VBScript 存取的任何介面,例如 COM (元件物件模型)。
在以下环境下对每个脚本进行评估:
- 将新配置部署到计算机时。
- 用户登录时。
若要建立或編輯指令碼,請前往 應用程式控制項 組態編輯器中所需的「已編寫指令碼的規則集」。 規則集 > 已編寫指令碼 > [規則集名稱]
您可以使用以下脚本规则选项来定义脚本何时运行:
- 執行指令碼
- 每個工作階段以使用者身分 - 每次使用者登入時執行指令碼。 僅對於使用者工作階段的持續時間套用設定。
- 每個工作階段以系統身分 - 每次使用者登入時以系統帳戶權限執行指令碼。 僅對於使用者工作階段的持續時間套用設定。
- 每部電腦以系統身分 - 每次電腦啟動時以系統帳戶權限執行指令碼。 設定會套用至所有使用者工作階段直到電腦重新啟動為止,應用程式控制項 代理程式會重新啟動或發生組態變更。
- 等候登入完成 - 選取此選項以避免在使用者登入完成之前執行指令碼。
注意:作为系统用户运行脚本可能会对计算机造成严重损坏,只能由有经验的脚本作者启用。
VBScripts
每个脚本都在托管脚本引擎中运行,允许对脚本执行进行更有效的控制,同时提供高度的输入和输出控制。
- 不使用 VBS 文件。
- 没有生成单独的进程。
脚本必须作为函数编写,并且可以包含许多函数,但是必须指定一个主启动函数。 启动函数由 應用程式控制項 代理运行,可用于调用其他函数。
AMScriptRule COM 对象内置在脚本引擎中,并提供对以下方法的访问:
strUsername = AMScriptRule.UserName
strUserdomain = AMScriptRule.UserDomain
strSessionid = AMScriptRule.SessionID
strStationname = AMScriptRule.WinStation
此实例中的 Microsoft standard 表示 WinStation 返回终端服务会话名称的值,其由会话的类型决定,典型值是 ’Console’ 或 ’RDP-Tcp#34’,而不是窗口站的名称(通常为 WinSta0)。
AMScriptRule COM 对象还包括以下方法:
strLog = AMScriptRule.Log "My Log Statement"
允许您将记录字符串输出到代理日志文件中,以用于调试脚本规则。
strEnvironmentvar = AMScriptRule.ExpandEnvironment ("%MyEnvironmentVariables%")
展开运行脚本的用户的环境变量。
使用 WScript. shell 來展開環境變數以僅傳回 SYSTEM 變數。
Windows PowerShell 脚本
如果脚本以值 0 返回(退出),则脚本将通过并且应用规则。 如果返回任何非零值,则脚本将失败并且不应用规则。
每个 PowerShell 脚本都在 PowerShell.exe 的实例中执行,因此 應用程式控制項 既不强制执行也不添加任何特定语法,所有格式正确的 PowerShell 都将正常工作。
PowerShell 必须安装在任何将使用脚本的端点上。
示例脚本
以下 VBScript 將示範如何控制使用者可存取的應用程式。
Function ScriptedRule()
’Name of Filter scan expected to pass
ExpectedFilter = "FWALL"
’Get Server Name
Set objNTinfo = CreateObject ("WinNTSystemInfo")
ServerName = lcase (objNTInfo.ComputerName)
’Set initial return value
ScriptedRule = False
’Create MetaFrame Session Object
Set MFSession = Createobject ("MetaFrameCOM.MetaFrameSession")
’Initialize the session filters for this session
For Each x in MFSession.SmartAccessFilters
’return true if our filter is found
If x = ExpectedFilter Then
ScriptedRule=True
AMScriptRule.Log "SmartAccessFilter match found."
End If
Next
End Function
以下 VBScript 可用來判斷電腦是否位於「電腦組織單位」中:
Function ScriptedRule()
ScriptedRule = vbFalse
strCompName = AMScriptRule.StationName
Set oRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = oRootDSE.Get("DefaultNamingContext")
Set oOU = GetObject("LDAP://OU=TheOUyouAreSearching,OU=Parent,OU=Parent," & strDNSDomain)
oOU.GetInfo
For each member in oOU
If UCase(strCompName) = UCase(member.CN) Then
ScriptedRule = vbTrue
Exit For
End If
Next
End Function
以下示例 VBScript 显示了脚本的主要组件,并演示了如何访问登录到系统的用户的用户名信息,以及如何与特定域和组织单位匹配:
Function MyScript()
'Get the username of the user logging in (also works when running as SYSTEM)
strUserName = AMScriptRule.UserName
'Get the domain of the user logging in (also works when running as SYSTEM)
strUserDomain = AMScriptRule.UserDomain
'Look up user environment variables (when running as SYSTEM, only SYSTEM variables are available)
strClientName = AMScriptRule.ExpandEnvironment ("%ClientName%")
'Log the output
AMScriptRule.Log strUserName & " logged in on " & strClientName
'Check if the user is a member of the domain
If strUserdomain = "MyDomain" Then
'If so, see if the user is in the MyOU OU
Set objOU = GetObject ("LDAP://ou=MyOU,dc=MyDomain,dc=com")
objOU.Filter = Array("user")
For Each objUser In objOU
'Check if there is a match with the user logging on
If objUser.sAMAccountName = strUserName Then
'if there is, then set the function to True
MyScript = True
End If
Next
End If
'Unless there is a username match, the function defaults to False
End Function
以下示例 Windows PowerShell 脚本显示了脚本的主要组件,并演示了如何访问登录到系统的用户的用户名信息,以及如何与特定域和组织单位匹配:
#Script checks if the current user is a member of the OU specified
# Return 0 if TRUE
# 1 otherwise
$logonuser = $env:username
$bindpt = [adsi] "LDAP://OU=TS_Users,OU=Users,OU=MyUser,OU=MyOU,DC=MyDomain,DC=com"
$users = New-Object System.DirectoryServices.DirectorySearcher $bindpt
$users.Filter = "(&(objectClass=User)(sAMAccountName=$logonuser))"
$obj = $users.FindOne()
if($obj -eq $null)
{
#" Not a Member"
exit 1
}